package com.itheima.reggie.common;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

/**
 * 自定义元数据处理器
 */
@Component
@Slf4j
public class MyMetaObjecthandler implements MetaObjectHandler {
    /**
     * 添加操作 自动填充
     * @param metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {

log.info("公共字段填充[insert].....");
        //设置创建时间
metaObject.setValue("createTime", LocalDateTime.now());
        //设置修改时间
metaObject.setValue("updateTime", LocalDateTime.now());
        //获取当前用户id
        Long empId = BaseContext.getCurrentId();
        log.info("线程id为 {}",empId);

        //设置创建人
metaObject.setValue("createUser",empId);
        //修改创建人
metaObject.setValue("updateUser",empId);

    }

    /**
     * 更新操作 自动填充
     * @param metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("公共字段填充[update].....");
        //设置修改时间
        metaObject.setValue("updateTime", LocalDateTime.now());
        //取出线程存放的id
        Long empId = BaseContext.getCurrentId();
        log.info("线程id为 {}",empId);
        //设置修改人
        metaObject.setValue("updateUser",empId);
    }
}
/*
*   1.在需要被自动填充数据的属性上加对应的注解
*
        @TableField(fill = FieldFill.INSERT)//插入时填充字段
        private LocalDateTime createTime;

        @TableField(fill = FieldFill.INSERT_UPDATE)//插入和修改时填充字段
    private LocalDateTime updateTime;
    *
    * 2.定义类 implements MetaObjectHandler,编写自动填充的策略
    *        1. insertFill: 新增操作的时候，执行的填充策略
             2.updateFill :  修改操作的时候，执行的填充策略
      3.指定具体填充的数据
        metaObject.setValue("updateTime", LocalDateTime.now());
      4.获取当前登录用户的Id:
    *   1.定义BaseContext, 里头声明了一个ThreadLocal,提供了set，get方法,用于设置当前登录用户的ID和获取当前登录用户的ID
    *   2.登录验证的Filter中如果登录放行了，则设置前登录用户的ID
    *   3.在填充数据的时候,获取前登录用户的ID即可


 */